package com.emato.cus.util;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * 日期工具类
 *
 * @author yechao
 * @date 2013年12月12日
 */
public class DateUtil {
    /**
     * 时间格式(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN_YYYY_MM_DD = "yyyy-MM-dd";
    /**
     * 时间格式(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN_YYYY_T_HH_Z = "yyyy-MM-dd'T'HH:mm:ss.SSS Z";


    /**
     * 字符串的日期类型 转换称 Date 类型
     *
     * @param timeContent 字符串的日期类型
     * @param formatStyle 日期格式
     * @return
     */
    public static Date stringConvertDate(String timeContent, String formatStyle) {
        SimpleDateFormat format = new SimpleDateFormat(formatStyle);
        try {
            return format.parse(timeContent);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 检查日期格式
     *
     * @param time
     * @param format
     * @return
     */
    public static boolean checkDate(String time, String format) {
        if (stringConvertDate(time, format) == null) {
            return false;
        }
        return true;
    }

    /**
     * Date 转化成 String 类型的字符串日期格式
     *
     * @param date
     * @param formatStyle 转化成 什么格式
     * @return
     */
    public static String dateConvertString(Date date, String formatStyle) {
        SimpleDateFormat format = new SimpleDateFormat(formatStyle);
        return format.format(date);
    }

    /**
     * 字符串日期格式 转换成 带 地区标识的 Date 类型
     *
     * @param strDate
     * @param locale
     * @param formatStyle
     * @return
     */
    public static Date stringConvertLocalDate(String strDate, Locale locale, String formatStyle) {
        SimpleDateFormat srcsdf = new SimpleDateFormat(formatStyle, locale);
        try {
            return srcsdf.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取本地时间相对的UTC | GMT时间
     *
     * @return
     */
    public static Date getUtcTime() {
        // 1、取得本地时间：
        Calendar calendar = Calendar.getInstance();
        // 2、取得时间偏移量：
        final int zoneOffset = calendar.get(Calendar.ZONE_OFFSET);
        // 3、取得夏令时差：
        final int dstOffset = calendar.get(Calendar.DST_OFFSET);
        // 4、从本地时间里扣除这些差量，即可以取得UTC时间：
        calendar.add(Calendar.MILLISECOND, -(zoneOffset + dstOffset));
        return calendar.getTime();
    }

    /**
     * 获取2个时间相差多少秒
     *
     * @param date1
     * @param date2
     * @return
     */
    public static Long getDiffSeconds(Date date1, Date date2) {
        long milliseconds1 = date1.getTime();
        long milliseconds2 = date2.getTime();
        long diff = milliseconds1 - milliseconds2;
        if (diff < 0) {
            diff = -diff;
        }
        long diffSeconds = diff / (1000);
        return diffSeconds;
    }

    /**
     * 获取2个时间相差多少分钟
     *
     * @param date1
     * @param date2
     * @return
     */
    public static Long getDiffMinutes(Date date1, Date date2) {
        Long diffMinutes = getDiffSeconds(date1, date2) / 60;
        return diffMinutes;
    }

    /**
     * 获取2个时间直接 相差多少小时
     *
     * @param date1
     * @param date2
     * @return
     */
    public static Long getDiffHours(Date date1, Date date2) {
        Long diffHours = getDiffMinutes(date1, date2) / 60;
        return diffHours;
    }

    /**
     * 获取2个时间直接 相差多少天
     *
     * @param date1
     * @param date2
     * @return
     */
    public static Long getDiffDays(Date date1, Date date2) {
        Long diffDays = getDiffHours(date1, date2) / 24;
        return diffDays;
    }

    /**
     * 多少天以前
     *
     * @param ago
     * @return
     */
    public static String getDaysAgoStart(int ago) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR, -ago);
        String time = DateUtil.dateConvertString(calendar.getTime(), DateConstant.DATE_MONTH_DAY);
        String timeFrom = time + " 00:00:00";
        return timeFrom;
    }

    /**
     * 获得指定日期的下一天
     *
     * @param day
     * @return
     */
    public static String getNextDayTime(String day) {
        Date date = DateUtil.stringConvertDate(day, DateConstant.DATE_TIME_SECOND);

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, 1);

        return new SimpleDateFormat(DateConstant.DATE_TIME_SECOND).format(cal.getTime());
    }

    /**
     * 获得指定日期的前一天
     *
     * @param day
     * @return
     */
    public static String getPreDayTime(String day) {
        Date date = DateUtil.stringConvertDate(day, DateConstant.DATE_TIME_SECOND);

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, -1);

        return new SimpleDateFormat(DateConstant.DATE_TIME_SECOND).format(cal.getTime());
    }

    /**
     * 获得指定日期的前一天
     *
     * @param day
     * @return
     */
    public static String getPreDayDate(String day) {
        Date date = DateUtil.stringConvertDate(day, DateConstant.DATE_MONTH_DAY);

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, -1);

        return new SimpleDateFormat(DateConstant.DATE_MONTH_DAY).format(cal.getTime());
    }

    /**
     * 多少天以后
     *
     * @param date
     * @param dayNum
     * @return
     */
    public static Date getNextPrevDay(Date date, int dayNum) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, dayNum);
        return calendar.getTime();
    }

    /**
     * 判断time1 是否早于time2
     *
     * @param time1
     * @param time2
     * @return
     */
    public static boolean before(String time1, String time2) {
        Date date1 = DateUtil.stringConvertDate(time1, DateConstant.DATE_TIME_SECOND);
        Date date2 = DateUtil.stringConvertDate(time2, DateConstant.DATE_TIME_SECOND);

        return date1.before(date2);
    }

    /**
     * 获得当前系统时间
     *
     * @return
     */
    public static String getSystemDate() {
        SimpleDateFormat sdf = new SimpleDateFormat(DateConstant.DATE_TIME_SECOND);
        return sdf.format(new Date());
    }

    /**
     * 得到某个时间段加上多少小时的时间
     *
     * @param dateTime
     * @param hours
     * @return
     */
    public static Date getDateTimeAddHours(Date dateTime, Integer hours) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dateTime);
        calendar.add(Calendar.HOUR, hours);
        return calendar.getTime();
    }

    /**
     * 获取当前时间的时间戳
     *
     * @return
     */
    public static long getTimestampByDate() {
        return System.currentTimeMillis();
    }

    /**
     * 获取指定时间的时间戳
     *
     * @param dt
     * @return
     */
    public static long getTimestampByDate(Date dt) {
        return dt.getTime();
    }

    /**
     * 取得当前unix时间戳（精确到秒）
     *
     * @return unixTimeStamp
     */
    public static String getUnixTimeStamp() {
        long time = System.currentTimeMillis();
        String unixTimeStamp = String.valueOf(time / 1000);
        return unixTimeStamp;
    }


    /**
     * 日期格式字符串转换成时间戳
     *
     * @param dateStr 字符串日期
     * @param format  如：yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String Date2UnixTimeStamp(String dateStr, String format) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return String.valueOf(sdf.parse(dateStr).getTime() / 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 判断是否当天日期
     *
     * @param dateStr
     * @param formatStr
     * @return
     */
    public static boolean isToday(String dateStr, String formatStr) {
        try {
            SimpleDateFormat format = new SimpleDateFormat(formatStr);
            Date date = format.parse(dateStr);

            Calendar c1 = Calendar.getInstance();
            c1.setTime(date);
            int year1 = c1.get(Calendar.YEAR);
            int month1 = c1.get(Calendar.MONTH) + 1;
            int day1 = c1.get(Calendar.DAY_OF_MONTH);

            Calendar c2 = Calendar.getInstance();
            c2.setTime(new Date());
            int year2 = c2.get(Calendar.YEAR);
            int month2 = c2.get(Calendar.MONTH) + 1;
            int day2 = c2.get(Calendar.DAY_OF_MONTH);

            if (year1 == year2 && month1 == month2 && day1 == day2) {
                return true;
            }
            return false;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }
}
